import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/util/LogUtil.dart';

/**
 * https://book.flutterchina.club/chapter6/scroll_controller.html
 * ScrollController({
    double initialScrollOffset = 0.0, //初始滚动位置
    this.keepScrollOffset = true,//是否保存滚动位置
    offset：可滚动组件当前的滚动位置。
    jumpTo(double offset)、animateTo(double offset,...)：
    这两个方法用于跳转到指定的位置，它们不同之处在于，后者在跳转时会执行一个动画，而前者不会。
    --------------------------------------------------------------------------------------
    ScrollController间接继承自Listenable，我们可以根据ScrollController来监听滚动事件
    })
 */

///
class ScrollControllerWidget extends StatefulWidget {
  final String ?text;

  ScrollControllerWidget({this.text}) : super();

  @override
  State<StatefulWidget> createState() {
    return _ScrollControllerState(text??"");
  }
}

class _ScrollControllerState extends State<ScrollControllerWidget> {
  String ?title;

  _ScrollControllerState(String text) {
    title = text;
  }

  //监听
  ScrollController _scrollController = ScrollController();
  bool showToTopBtn = false; //是否显示“返回到顶部”按钮

  @override
  void initState() {
    super.initState();
    //监听滚动事件，打印滚动位置
    _scrollController.addListener(() {
      LogUtil.v("偏移量....+ $_scrollController.offset"); //打印滚动位置
      if (_scrollController.offset < 1000 && showToTopBtn) {
        setState(() {
          showToTopBtn = false;
        });
      } else if (_scrollController.offset >= 1000 && showToTopBtn == false) {
        setState(() {
          showToTopBtn = true;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          title??"",
          style: TextStyle(fontSize: 18),
        ),
      ),
      body: Scrollbar(
        child: ListView.builder(
            itemCount: 100,
            itemExtent: 50,
            //   itemExtent: 50.0, //列表项高度固定时，显式指定高度是一个好习惯(性能消耗小)
            controller: _scrollController,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text("$index"),
              );
            }),
      ),
      floatingActionButton: !showToTopBtn
          ? null
          : FloatingActionButton(
              child: Icon(Icons.arrow_upward),
              onPressed: () {
                //返回到顶部时执行动画
                _scrollController.animateTo(0,
                    duration: Duration(milliseconds: 200), curve: Curves.ease);
              }),
    );
  }

  @override
  void dispose() {
    //为了避免内存泄露，需要调用_controller.dispose
    _scrollController.dispose();
    super.dispose();
  }
}
